package org.example;

import java.util.HashSet;
import java.util.Set;

public class Test3 {
    //leetcode 202 快乐数 https://leetcode.cn/problems/happy-number/description/

    /**
     * 方法一：因为在求快乐数的过程中，最终一定会出现重复值，当出现重复值的时候，判断 重复值是多少：
     * 如果重复值是1，就代表是快乐数
     * @param n
     * @return
     */
    public boolean isHappy(int n) {
        Set<Integer> set = new HashSet<>();
        while (true) {
            int sum = 0;
            while (n != 0) {
                sum += (n % 10) * (n % 10);
                n /= 10;
            }
            n = sum;
            if (set.contains(n)) break;
            else set.add(n);
        }
        if (n == 1) return true;
        return false;
    }

    public int bitSum(int n) {
        int sum = 0;
        while (n != 0) {
            sum += (n % 10) * (n % 10);
            n /= 10;
        }
        return sum;
    }

    /**
     * 因为在求快乐数的时候一定会出现重复值，当出现重复值之后，后面的计算值也是重复的，也就是说，快乐数是一定存在环的
     * 我们通过快慢指针的方式，找到环的入口点的数字是多少，如果是1就是快乐数
     * @param n
     * @return
     */
    public boolean isHappy1(int n) {
        int slow = n, fast = bitSum(bitSum(n));
        while (fast != slow) {
            slow = bitSum(slow);
            fast = bitSum(bitSum(fast));
        }
        return slow == 1;
    }
}
